package com.yf.stack;

public class ThreadSafeTest {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();

        testUnsafe2(sb);
        // 可能存在并发的线程安全问题
        new Thread(() -> {
            sb.append("hello");
            sb.append("world");
        }).start();

    }

    // 线程安全
    public static void testSafe() {
        // sb是方法内的局部变量，存在于局部变量表中，每个线程都有各自独立的局部变量表，因此是线程安全的
        StringBuilder sb = new StringBuilder();
        sb.append("a");
        sb.append("b");
        System.out.println(sb);
    }

    // 线程不安全
    public static StringBuilder testUnSafe() {
        StringBuilder sb = new StringBuilder();
        sb.append("a");
        sb.append("b");
        return sb;  // sb是方法内的局部变量，但是最后向外暴露出去，有可能被其他线程操作
    }

    // 线程不安全
    public static void testUnsafe2(StringBuilder sb) {
        // sb并不是局域变量而是外部传入的，有可能其他线程也在操作它
        sb.append("c");
    }

    // 线程安全
    public static String testUnsafe3() {
        StringBuilder sb = new StringBuilder();
        sb.append("a");
        sb.append("b");
        return sb.toString(); // sb.toString()，是生成一个新的String对象，此时sb就消亡了。
    }
}
